#include "Xxk_PsGpio.h"


// 初始化PS侧GPIO,包括MIO和EMIO
int psGpioInti(XGpioPs *psGpioPtr, u16 psGpio_deviceId)
{
	XGpioPs_Config *psGpio_configPtr;
	psGpio_configPtr = XGpioPs_LookupConfig(psGpio_deviceId); // 根据器件ID查找配置

	int status;
	status = XGpioPs_CfgInitialize(psGpioPtr, psGpio_configPtr, psGpio_configPtr->BaseAddr); // 配置初始化配置
	if (status != XST_SUCCESS)
	{
		xil_printf("PsGpio %d Initialization Failed\r\n", psGpio_deviceId);
		return XST_FAILURE;
	}
	else
	{
		xil_printf("PsGpio %d Initialization Succeed\r\n", psGpio_deviceId);
		return status;
	}
}


// 设置psGpio某引脚为输入，输入无需使能
void psGpio_SetPinInput(const XGpioPs *psGpioPtr, u32 Pin)
{
	XGpioPs_SetDirectionPin(psGpioPtr, Pin, PSGPIO_INPUT);
}

// 设置psGpio某引脚为输出并使能
void psGpio_SetPinOutputAndEnbale(const XGpioPs *psGpioPtr, u32 Pin)
{
	XGpioPs_SetDirectionPin(psGpioPtr, Pin, PSGPIO_OUTPUT);
	XGpioPs_SetOutputEnablePin(psGpioPtr, Pin, PSGPIO_OUTPUT_ENABLE);
}

// 设置psGpio某引脚输出不使能
void psGpio_SetPinOutputDisbale(const XGpioPs *psGpioPtr, u32 Pin)
{
	XGpioPs_SetOutputEnablePin(psGpioPtr, Pin, PSGPIO_OUTPUT_DISABLE);
}



// PS GPIO PIN中断使能
void psGpio_PinIntr_SetAndEnable(XScuGic *scuGicPtr, XGpioPs *psGpioPtr, u32 psGpio_intrId,
								 Xil_ExceptionHandler psGpio_Handler, u32 Pin, u8 IrqType)
{
	// 连接中断ID与固定服务函数
	XScuGic_Connect(scuGicPtr, psGpio_intrId, (Xil_ExceptionHandler)psGpio_Handler, (void *)psGpioPtr);
	// 启用对应中断ID的中断源
	XScuGic_Enable(scuGicPtr, psGpio_intrId);

	// 注意psGPIO中断不需要设置中断优先级

	// 设置psGPIO中断类型
	XGpioPs_SetIntrTypePin(psGpioPtr, Pin, IrqType);
	// 使能之前先清除中断状态，不清除中断状态寄存器可能受之前程序影响为1，导致烧写程序自动进一次中断
	XGpioPs_IntrClearPin(&psGpio, EMIO0);
	// 使能psGPIO中断
	XGpioPs_IntrEnablePin(psGpioPtr, Pin);
}



// psGpio中断相关的函数
__weak void psGpio_Handler(void *CallBackRef)
{
	XGpioPs *psGpioPtr = (XGpioPs *)CallBackRef;
	//	psGpio_intrFlag = 1;

	if (XGpioPs_ReadPin(psGpioPtr, MIO12) == 0)
	{
		XGpioPs_IntrDisablePin(psGpioPtr, MIO12);
		XGpioPs_IntrClearPin(psGpioPtr, MIO12);
//		xil_printf("This is psGpio_Handler - MIO12\r\n");
	}
	else if (XGpioPs_ReadPin(psGpioPtr, EMIO4) == 0)
	{
		XGpioPs_IntrDisablePin(psGpioPtr, EMIO4);
		XGpioPs_IntrClearPin(psGpioPtr, EMIO4);
//		xil_printf("This is psGpio_Handler - EMIO4\r\n");
	}
}
